8


Меню

Поговорим о создании меню. Никто не будет спорить, что меню сейчас является неотъемлемой частью практически любого приложения Windows. А раз так, то наша задача - научиться добавлять в наши программы "менюшки". Создание меню в VB происходит очень просто. Для этого в нем предусмотрен Menu Editor ("редактор меню"), в котором можно:

1) "набить" структуру будущего меню;
2) указать возможные "горячие" клавиши вызова того или иного пункта;
3) сделать недоступными те или иные пункты меню;
4) сделать отмеченными те или иные пункты меню;
5) создать в меню разделители ("сепараторы"), т.е. горизонтальные линии, разделяющие однотипные пункты меню.

В общем, Menu Editor позволяет создавать меню, отвечающее всем требованиям стандартного Windows приложения. Работу Menu Editor лучше всего рассматривать на примере. Допустим, что мы хотим создать приложение, демонстрирующее различные элементы управления VB и использовать для этого меню. Общий вид приложения показан на рисунке.

Оставим пока в стороне программную часть приложения и сосредоточимся на том, как нам добавить в нашу программу меню. Для этого необходимо вызвать редактор меню (Menu Editor) с помощью сочетания клавиш Ctrl+E или выбрав пункт верхнего меню VB Tools | Menu Editor. Перед нами возникнет окно, в котором мы будем работать.

По большому счету, в данном окне нас интересуют только несколько элементов:

1) Текстовые поля: Caption (название пункта меню) и Name (имя пункта меню). Существует правило, по которому принято писать пункты меню на английском языке, а имена пунктов записывать как nmu+Name.
2) Командные кнопки: Next (новый пункт), Insert (вставить пункт), Delete (удалить пункт).
3) Командные кнопки: "вверх", "вниз", "вправо", "влево". Эти кнопки служат для специфических целей: кнопки "вверх", "вниз" передвигают пункты меню соответственно вверх или вниз по всему меню. Кнопки "вправо", "влево" сдвигают пункты меню вправо или влево, что определяет их принадлежность к подменю. Заметьте, что пункт меню "&Element" находится левее всех других пунктов - это означает, что остальные пункты (от "Label" до "Exit") являются его подпунктами и "выпадают" из него. (См. рисунок выше.)

Нам совершенно неинтересно, что: Menu Editor дает программисту массу дополнительных возможностей по проектированию "умного" меню. К ним относятся: 1) Shortcut ("горячая клавиша") для пункта; 2) NegotiatePosition (установка позиции) для пункта - слева, справа, по центру; 3) HelpContextID (номер раздела файла справки) пункта, по которому будет вызван справочный файл именно для этого пункта меню и пр.

Теперь займемся программированием. Для данного приложения оно несложное: необходимо поместить на форму все вышеперечисленные элементы управления, расположить их в рамке и у всех установить свойство Visible=False. Таким образом, все элементы будут присутствовать на форме, но не будут видны. При выборе того или иного элемента управления из меню необходимо: 1) менять заголовок рамки на название этого элемента (свойство Caption); 2) делать предыдущий элемент невидимым, а новый видимым.

Один из путей решения этих проблем может быть таким: написать вспомогательную функцию HideElements(), в которой всем свойствам Visible элементов (от "Label" до "OptionButton") присваивается значение False.

Public Function HideElements()
	Label1.Visible = False
	Text1.Visible = False
	Frame2.Visible = False
	Command1.Visible = False
	Check1.Visible = False
	Option1.Visible = False
End Function

Так как все пункты меню Element одинаковы, то можно привести только одну процедуру обработки выбора пункта меню. Пусть это будет выбор пункта Button. Чтобы создать ее достаточно выбрать на форме (находящийся в процессе разработки) пункт меню Element | Button и VB сам создаст процедуру mnuButton_Click(), в которой мы: 1) меняем надпись в "главной" рамке Frame1; 2) вызываем функцию HideElements(), которая делает все элементы невидимыми (а значит и тот, который был до командной кнопки); 3) делаем кнопку Button1 видимой.

Private Sub mnuButton_Click()
	Frame1.Caption = "Командная кнопка"
	Call HideElements
	Command1.Visible = True
End Sub   

Замечание 1. Помещайте на форму элементы управления в любом порядке, но элемент Frame (который будет на самом деле Frame2) в последнюю очередь.

Замечание 2. Чтобы создать в меню разделитель (горизонтальную линию, отделяющую разные пункты меню), необходимо поместить в пункт Caption знак "минус" ("-"), а в пункт Name - любое имя, например, nmuSeparator (разделитель).

Большой пример. Пусть требуется организовать меню для текстового поля, состоящее из пунктов "Буфер" (копировать, удалить, вставить) и "Перевод" (маленькие буквы в БОЛЬШИЕ, БОЛЬШИЕ БУКВЫ в маленькие). Возможный вид приложения приведен на рисунке.

Самостоятельно создайте на форме меню, состоящее из двух пунктов ("Буфер" и "Перевод"). Не имеет особого значения то, какие имена вы дадите пунктам меню, хотя, если это вызывает у вас затруднения (а у вас что-то всё вызывает затруднения ), то можете воспользоваться такими именами: Буфер (mnuClipboard), Копировать (mnuCopy), Удалить (mnuDelete), Вставить (mnuInsert), Перевод (mnuTranslition), БОЛЬШИЕ -> маленькие (mnuBigLittle), маленькие -> БОЛЬШИЕ (mnuLittleBig).

Несмотря на все мои старания избегать в данной книге сложностей, они начались... Сейчас мы поговорим о буфере обмена и "активном" элементе на форме. Буфер - это системный объект Windows, который позволяет хранить текстовую и графическую информацию. Все вы регулярно встречаетесь с буфером обмена во время работы в любом текстовом редакторе, при копировании, удалении и вставке части текста. Для работы с буфером в VB предусмотрен объект Clipboard, который имеет в своем распоряжении методы:

1) Clear - очистка содержимого буфера;
2) SetText - помещает выделенную строку текста в буфер;
3) SetData - помещает выделенное изображение в буфер;
4) GetText - возвращает строку текста из буфера;
5) GetData - возвращает изображение из буфера;
6) GetFormat - возвращает целое число, указывающее на то, элемент какого типа находится в буфере: 1 - текст; 2,3,8 - рисунок. Функция GetFormat возвращает значение True (истина), если в буфере находится тот элемент, который указан в качестве ее параметра. Пример:

If GetFormat(1)=True Then Print "В буфере находится текст"

Сейчас мы поговорим об объекте Screen. Этот объект находится на рабочем столе Windows и отслеживает положение и размер форм на экране, положение указателя мыши и пр. Нас у этого объекта интересует одно свойство - ActiveControl (активный элемент управления). Это свойство возвращает элемент управления, имеющий фокус. (Кстати, в нашем случае при наборе текста в окне Text1 таким элементом будет Text1.) А у активного элемента управления есть свойство SelText (выделенный текст), которое возвращает строку выделенного текста в активном элементе управления. Все, сложности кончились… Отдохните.

Спрашивается: зачем вам нужна вся эта вышеизложенная информация? Объясняю: а как вы иначе скопируете выделенный текст из текстового окна Text1 в буфер? Весь текст в этом окне нам доступен - Text1.Text, а то, что мы выделили - нет. Вот и приходится в процедуре mnuCopy_Click() (Буфер | Копировать) записывать два оператора:

1) Clipboard.Clear - очистить буфер;
2) Clipboard.SetText Screen.ActiveControl.SelText - занести в буфер текст, равный выделенному тексту активного элемента управления, т.е. (как было сказано выше) элемента Text1.

Rem Копировать в буфер
Private Sub mnuCopy_Click()
	Clipboard.Clear
	Clipboard.SetText Screen.ActiveControl.SelText
End Sub

Rem Удалить в буфер
Private Sub mnuDelele_Click()
	Clipboard.Clear
	Clipboard.SetText Screen.ActiveControl.SelText
	Screen.ActiveControl.SelText = ""
End Sub

Rem Вставить из буфера
Private Sub mnuInsert_Click()
	Screen.ActiveControl.SelText = Clipboard.GetText()
End Sub

Если это понятно, то процедуры перевода букв выделенного текста во все большие или все маленькие буквы не вызовут никаких вопросов:

Rem маленькие буквы -> БОЛЬШИЕ БУКВЫ
Private Sub mnuLittleBig_Click()
	Screen.ActiveControl.SelText = UCase(Screen.ActiveControl.SelText)
End Sub

Rem БОЛЬШИЕ БУКВЫ -> маленькие буквы
Private Sub mnuBigLittle_Click()
	Screen.ActiveControl.SelText = LCase(Screen.ActiveControl.SelText)
End Sub

Задания по лабораторной работе 8


1. Прочитать и законспектировать работу, проверить пример.
2. Разобрать два дополнительных примера (только для тех, у кого есть пособие и дискета с дополнительными примерами).
3. Осознать правила создания меню в приложениях Windows и все дальнейшие примеры сопровождать "менюшками".

Хостинг от uCoz